SPB Git forge

spb/spb-cloud

Public
10commits 1branches 0releases
3.2 MBsize
maindefault branch
yesterdaylast push
JavaScript 56.7% TypeScript 42.6%
2.3 KB · 80 lines typescript
Raw Blame History
1import { NextRequest, NextResponse } from "next/server";2import { prisma } from "@/lib/prisma";3import { saveFile, saveVersion } from "@/lib/storage";4import { logActivity } from "@/lib/activity";5import { MAX_VERSIONS_PER_FILE } from "@/lib/config";67export async function POST(8  request: NextRequest,9  { params }: { params: { id: string } }10) {11  const file = await prisma.file.findUnique({ where: { id: params.id } });1213  if (!file) {14    return NextResponse.json({ error: "File not found" }, { status: 404 });15  }1617  const formData = await request.formData();18  const blob = formData.get("file") as File;19  const asNewVersion = formData.get("asNewVersion") === "true";2021  if (!blob) {22    return NextResponse.json({ error: "No file provided" }, { status: 400 });23  }2425  const buffer = Buffer.from(await blob.arrayBuffer());2627  if (asNewVersion) {28    // Save current as version29    const versionCount = await prisma.fileVersion.count({ where: { fileId: file.id } });30    const versionResult = await saveVersion(file.storagePath, file.name);3132    await prisma.fileVersion.create({33      data: {34        fileId: file.id,35        versionNum: versionCount + 1,36        storagePath: versionResult.storagePath,37        size: BigInt(versionResult.size),38        changeNote: "Before edit",39      },40    });4142    // Cleanup old versions43    const versions = await prisma.fileVersion.findMany({44      where: { fileId: file.id },45      orderBy: { versionNum: "asc" },46    });47    if (versions.length > MAX_VERSIONS_PER_FILE) {48      const toDelete = versions.slice(0, versions.length - MAX_VERSIONS_PER_FILE);49      for (const v of toDelete) {50        const { deleteVersion } = await import("@/lib/storage");51        await deleteVersion(v.storagePath);52        await prisma.fileVersion.delete({ where: { id: v.id } });53      }54    }55  }5657  // Save edited file58  const result = await saveFile(buffer, file.name);5960  // Delete old file and update record61  const { deleteFile } = await import("@/lib/storage");62  await deleteFile(file.storagePath);6364  const updated = await prisma.file.update({65    where: { id: params.id },66    data: {67      storagePath: result.storagePath,68      size: BigInt(result.size),69      isEncrypted: true,70    },71  });7273  await logActivity("EDIT", file.id, `Edited ${file.name}`);7475  return NextResponse.json({76    ...updated,77    size: Number(updated.size),78  });79}80